<?php

namespace app\usedb\controller;

use app\BaseController;
use think\facade\Db;

class Select extends BaseController
{
    public function test()
    {
        // 1.查询
        // sql:SELECT * FROM `zx_xsb` WHERE `xh` = 9531134 LIMIT 1
        // find()   查一条记录，找不到返回null
        $list = Db::name('xsb')
            ->where('xh', '=', '9531134')
            ->find();
        dump($list);
        // findOrEmpty()    得到一维数组，找不到返回空数组
        $list = Db::name('xsb')
            ->where('xh', '=', '95311345')
            ->findOrEmpty();
        dump($list);
        // findOrFail()     找不到则报错
        $list = Db::name('xsb')
            ->where('xh', '=', '9531134')
            ->findOrFail();
        dump($list);

        //  select()  查全部
        $list = Db::name('xsb')->select();
        dump($list);
        // 转成数组
//        dump($list->toArray());
//        // 转成json格式
//        dump($list->toJson());

        // 结果集对象操作
        // 可以直接被循环的，被当成数组去使用
        // 结果集对象自带一个each()方法用来循环自己
        // 对结果集中的数据进行批处理
        $list->each(function ($value){
            if($value['sex']=='男'){
                $value['sex']='靓仔';
            }else{
                $value['sex']='靓女';
            }
            return $value;  //最后要返回值
        });
        dump($list);

        // value()  查一个值
        $list = Db::name('xsb')->where('xh', '=', '9531134')
            ->value('xm');
        dump($list);
        // value()  查列
        $list = Db::name('xsb')->where('sex', '=', '男')
            ->column('xm');
        dump($list);


        // 2.添加
        // save 添加方法 添加数据
//        $arr= ['xm'=>'王大锤', 'sex'=>"男", 'age'=>18];
//        $rt = Db::name('xsb')->save($arr);
//        dump($rt);

        // insert() 添加方法 如果数组中存在数据库中没有的字段名时，会抛出异常
//        $rt = Db::name('xsb')->insert($arr);
//        dump($rt);
        // 如果希望多余的字段不影响添加结果，那么需要使用strict(false)
//        $rt = Db::name('xsb' )
//            ->strict(false)
//            ->insert($arr);
//        dump($rt);
        // insertGetId() 添加成功 返回主键
//        $rt = Db::name('xsb' )
//            ->insertGetId(false)
//            ->insert($arr);
//        dump($rt);

        // insertAll() 批量添加
//        $arr = array(array('xm'=>'张三'),array('xm'=>'李四'),array('xm'=>'王五'));
//        $rt = Db::name('xsb')->insertAll($arr);
//        dump($rt);

        // 3.修改
        $arr2 = array('xh'=>9531172, 'xm'=>'王大锤', 'sex'=>'男', 'age'=>18);
        // save方法 并且在数组中添加主键字段 即可实现修改
        // 如果主键值不存在，则不会对数据库产生任何的影响 返回0
//        $rt = Db::name('xsb')->save($arr2);
//        dump($rt);

        // update 和where一起使用
//        $rt = Db::name('xsb')
//            ->where('xh','=', '9531172')
//            ->update($arr2);
//        dump($rt);
        // 如果数组中有主键，where可以省略
//        $rt = Db::name('xsb')
//            ->update($arr2);
//        dump($rt);

        // Db::raw('原生语句')   可以使用sql原生累加等操作，以免被识别成字符串类型
//        $arr3 = array(
//            'xh'=>9531172,
//            'xm'=>'王大锤',
//            'sex'=>'男',
//            'age'=>Db::raw('age+1'));   // 只让年龄累加1
//        $rt = Db::name('xsb')->update($arr3);
//        dump($rt);

        // inc('属性名', 步长)  实现按步长累加   dec按步长累减
//        $rt = Db::name('xsb')
//            ->where('xh','=','9531174')
//            ->inc('age',-5)  // 自增长，步长为5
//            ->update();
//        dump($rt);

        // 4.删除
        // 主键删除
        Db::name('xsb')->delete('9531178');     //写法1
        Db::name('xsb')
            ->where('xh','=','9531179')
            ->delete();                                    //写法2

    }

    public function search()
    {
        // 查询表达式 where用法
        // where(字段名,表达式,值)
        $list = Db::name('xsb')
            ->where('sex','<>','男')
            ->select();
        dump($list);

        // like 模糊搜索符合的
        $list = Db::name('xsb')
            ->where('xm','like', '%飞%')
            ->select();
        dump($list);
        // not like 模糊搜索不符合的
        $list = Db::name('xsb')
            ->where('xm','not like', '%飞%')
            ->select();
        dump($list);
        // in 表达式
        $list = Db::name('xsb')
            ->where('szx', 'in', array(4,5,6))
            ->select();
        dump($list);
        // whereIn 快捷写法
        $list = Db::name('xsb')
            ->whereIn('szx', array(4,5,6))
            ->select();
        dump($list);
        // null 表达式
        $list = Db::name('xsb')
            ->where('del', 'not null')
            ->select();
        dump($list);
        // null/notnull快捷写法
        $list = Db::name('xsb')
            ->whereNotNull('del')
            ->select();
        dump($list);
        // 使用time表达式，自动将时间格式转换为时间戳进行查询
        $list = Db::name('xsb')
            ->where('del','> time', condition: '2021-5-30')
            ->select();
        dump($list);
        // whereTime快捷写法
        $list = Db::name('xsb')
            ->whereTime('del','<','2021-7-20')
            ->select();
        dump($list);
        // whereYear 年份快捷写法
        $list = Db::name('xsb')
            ->whereYear('del', '2021')
            ->select();
        dump($list);

        // 多条件查询 and连接
        $list = Db::name('xsb')
            ->where('sex', '=', '男')
            ->where('szx', '=', '1')
            ->select();
        dump($list);

        // 多条件查询 or连接
        $list = Db::name('xsb')
            ->where('szx', '=', 2)
            ->whereOr('szx', '=', 2)
            ->select();
        dump($list);
    }
    public function transaction()
    {
        // 同一事务的多条sql语句同时执行，但发生异常时全部自动回滚
        // 写法1：commit/rollback
        Db::startTrans();
        try {
            Xsb::where('xm', '=', '周树人')
                ->save(['age' => 10]);
            Xsb::where('xm1', '=', '小李')
                ->save(['age' => 20]);
            Db::commit();
        } catch (\Exception $e) {
            Db::rollback(); // 回滚
        }

        // 写法2：闭包写法（常用）
        $arr = 20;
        Db::transaction(function () use ($arr) {
            Xsb::where('xm', '=', '周树人')
                ->save(['age' => $arr]);
            Xsb::where('xm', '=', '小李')
                ->save(['age' => $arr]);
        });
    }
}